<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- 构造函数的prototype属性非常有用 -->
    <!-- 构造函数的prototype是实例的原型(三角关系) -->
    <!-- JavaScript规定:实例可以打点访问它的原型的属性和方法被称为原型链查找 -->
    <script>
        function People(name, age, sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
        }
        // 实例化
        var xiaoming = new People('小明', 15, '男')
            // 测试三角关系(===比较类型和值，==只比较值)
        console.log(xiaoming.__proto__ === People.prototype)
            // 往原型上添加nationnality属性
        People.prototype.nationnality = '中国'
        console.log(xiaoming);
        // 
        var Tom = new People('汤姆', 16, '男')
        Tom.nationnality = '美国';
        console.log(Tom.nationnality); // 美国   原型链的遮蔽  

        //hasOwnProperty 方法可以检查对象是否真正自己拥有某个属性或者方法
        // in 运算符只能检查某个属性或者方法是否可以被对象访问,不能检查是否是自己的属性或者方法
        console.log('name' in xiaoming); //true
        console.log('age' in xiaoming); //true
        console.log('sex' in xiaoming); //true
        console.log('nationnality' in xiaoming); //true
        console.log(xiaoming.hasOwnProperty('name')); //true
        console.log(xiaoming.hasOwnProperty('age')); //true
        console.log(xiaoming.hasOwnProperty('sex')); //true
        console.log(xiaoming.hasOwnProperty('nationnality')); //false


        // 方法直接添加到每个实例身上的缺点：每个实例和每个实例的方法函数都是内存中不同的函数，造成内存的浪费
        // 解决方法： 将方法写道prototype上，节约内存

        // 原型链终点(Object  JS内置的对象定义有hasOwnProperty(), toString())
        console.log(xiaoming.__proto__.__proto__ === Object.prototype); //true
        console.log(Object.prototype.__proto__); // null   Object.prototype原型链终点
        // 关于数组的原型链
        var arr = [111, 222, 333, 444]
        console.log(arr.__proto__ === Array.prototype);
        console.log(arr.__proto__.__proto__ === Array.prototype.__proto__);
        console.log(arr.__proto__.hasOwnProperty('push'));
    </script>
</body>

</html>